package cn.snowheart

/**
 * 方法
 * 1. 默认情况下，如果未提供可见性修饰符，则该方法为public
 * 2. 定义参数时，不必显式定义类型
 * 3. Groovy中的方法是使用返回类型或使用def关键字定义的
 *
 *
 * @author liuwanxiang
 * @version 2019/05/31
 */
class MethodExample {

    static void main(String[] args) {
        println(method1())
        method2()
        println(method3())

        println("===============")

        println(method4(1, 2))
        println(method4(1.5, 2.1))

        println("===============")

        method5(3)
        method5(2,1)

        println("===============")

        def example = new MethodExample()
        example.method6("param")

        println("===============")
        println method7()
        example.method8()

    }

    // Method 1&2&3
    // 方法可使用def作为返回值类型，也可以使用具体的返回值类型或void定义
    static def method1() {
        println("This is method1")
        return 1
    }

    static void method2() {
        println("This is method2")
    }

    static int method3() {
        println("This is method3")
        return 1
    }

    // Method 4
    // 可以在定义方法时，对参数和返回值类型做模糊处理
    // 具体使用时，能匹配到具体的，就使用具体的方法
    // 不能匹配到具体的方法，才会使用模糊参数类型的方法
    static def method4(param1, param2) {
        return param1 + param2
    }

    static int method4(int param1, int param2) {
        return param1 + param2
    }

    // Method5
    // 方法参数可以使用默认值，默认值顺序在参数列表中不做要求
    // 当调用方法，输入的参数少于定义的参数个数时，优先将输入参数与没有默认值的参数绑定
    // 只有输入参数和定义参数个数一致时，才会按顺序进行参数绑定
    static void method5(param2 = 0, param1) {
        println(param1 + param2)
    }

    // Method6
    // 实例方法
    void method6(param){
        println("object's method: " + param)
    }

    // Method7
    // 变量的作用域
    static int x = 100
    static def method7(){
        int lx = 200
        println lx
        return x
    }

    // Method8
    // 成员变量 this引用
    int y = 300
    void method8(){
        println(this.y)
    }

}
